﻿using System;

namespace 代理模式
{
    class Program
    {
        static void Main(string[] args)
        {
            /*代理模式：
             * 从本质上看代理就是一个委托。
             * 
             * 为其他对象提供一种代理以控制对这个对象的访问
             * 有点像单例模式，单例模式全局唯一
             * 和单路的不同之处也正好事他最大的优点
             * 
             * 1.远程代理，也就是为一个对象在不同的地址空间提供局部代表，
             * 这样可以隐藏一个对象存在不同空间的事实。
             * 2.虚拟代理，是根据需要创建开销很大的对象，通过它来存放实例化需要很长时间的真实对象
             * 3.安全代理， 用来控制真实对象访问的权限
             * 4.智能索引，调用真实对象时，代理处理另外一些事。
             * 
             */
           // me 不好出面 ，所以我就用中间商来解决 
            middleman middlemans = new middleman();
            middlemans.buy();
            middlemans.sell();

            Features features = new middleman();
            features.Buy();
           
        }
    }
    #region 接口

    interface IFeatures
    {
        /// <summary>
        /// 买
        /// </summary>
        void buy();
        /// <summary>
        /// 买
        /// </summary>
        void sell();
        /// <summary>
        /// 讲价
        /// </summary>
        void higgle();
    }

    #endregion

    #region 抽象

    abstract class Features
    {
        public abstract void Buy();

    }

    #endregion

    /// <summary>
    /// 我
    /// </summary>
    class me : Features, IFeatures
    {
        public void buy()
        {
            Console.WriteLine("买个锤子");
        }

        public override void Buy()
        {
            Console.WriteLine("买个煎饼");
        }

        public void higgle()
        {
            throw new NotImplementedException();
        }

        public void sell()
        {
            throw new NotImplementedException();
        }
    }

    /// <summary>
    /// 中间商
    /// </summary>
    class middleman : Features, IFeatures
    {
        me me;
        seller seller;
        public void buy()
        {
            if (me == null)
            {
                me = new me();
            }
            me.buy();
         
        }

        public override void Buy()
        {
            if (me==null)
            {
                me = new me();
            }
            me.Buy();
        }

        public void higgle()
        {
            throw new NotImplementedException();
        }

        public void sell()
        {
            if (seller ==null)
            {
                seller = new seller();
            }
            seller.sell();
        }
    }

    /// <summary>
    /// 卖家
    /// </summary>
    class seller : IFeatures
    {
        public void buy()
        {
            //Console.WriteLine("老子给你一锤。");
        }

        public void higgle()
        {
            throw new NotImplementedException();
        }

        public void sell()
        {
            Console.WriteLine("老子给你一锤。");
        }
    }
}
